#ifndef SIGNWAY_P2P_TYPE_H
#define SIGNWAY_P2P_TYPE_H
#include "iostream"
#define MAX_FILE_NAME_LENGTH 0xFF

#define JSON_MSG_ID "msgId"
#define JSON_MSG_TYPE "msgType"
#define JSON_MSG_CODE "msgCode"
#define JSON_DESIRED "desired"
#define JSON_SEND_TIME "sendTime"
#define JSON_HOST "host"
#define JSON_DEST "dest"
#define JSON_NODE_LIST "nodeList"
#define JSON_NODE "node"
#define JSON_OWNER "owner"
#define JSON_FILE_PATH "filePath"
#define JSON_SIZE "size"
#define JSON_MD5 "md5"
#define JSON_RES_LIST "resList"
#define JSON_LOG "log"

typedef enum _P2P_PACKET_TYPE {
    P2P_PACKET_TYPE_JSON = 0,
    P2P_PACKET_TYPE_RES = 1,
} P2P_PACKET_TYPE;

typedef enum _P2P_MSG_TYPE {
    P2P_MSG_TYPE_DEV_TO_DEV = 103,
} P2P_MSG_TYPE;

typedef enum _P2P_MSG_CODE {
    P2P_MSG_CODE_ACK_OK         = 101, /* ACK OK */
    P2P_MSG_CODE_ACK_FAIL       = 102, /* ACK FAIL */
    P2P_MSG_CODE_HEARTBEAT      = 401, /* 心跳包 */
    P2P_MSG_CODE_PING           = 402, /* ping 包 */
    P2P_MSG_CODE_NODE_LIST      = 404, /* 节点列表 */
    P2P_MSG_CODE_RES_LIST       = 405, /* 资源列表 */
    P2P_MSG_CODE_RES_GET        = 406, /* 资源请求 */
    P2P_MSG_CODE_LOG_PACK       = 500, /* 日志包 */
} P2P_MSG_CODE;

#define ANALYSE_SET_VALUE(val, i) val[sizeof(val) - 1 - i]

typedef struct _P2P_PACKET_DATA{
    union { /* 包头 */
        struct {uint8_t start_data[2];};
        uint16_t start;
    };
    union { /* 包长度 */
        struct {uint8_t length_data[4];};
        uint32_t length;
    };
    uint8_t type; /* 数据类型 */
    uint8_t empty[3]; /* 保留位 */
    uint8_t *package_body; /* 包体 */
    uint32_t package_body_len; /* 包体长度 */
    union { /* 校验位 */
        struct {uint8_t crc_data[2];};
        uint16_t crc;
    };
} P2P_PACKET_DATA;

typedef struct _P2P_PACKET_RES {
    union { /* 资源偏移量 */
        struct {uint8_t offset_data[8];};
        uint64_t offset;
    };
    char filepath[MAX_FILE_NAME_LENGTH];/* 文件路径 */
    uint8_t *data;/* 数据体 */
    uint32_t data_len;
} P2P_PACKET_RES;

typedef struct _P2P_PACKET_JSON {
    uint64_t msgId;
    int msgType;
    int msgCode;
    void* desired;
    uint64_t sendTime;
} P2P_PACKET_JSON;

typedef struct _P2P_JSON_RES_NODE {
    struct _P2P_JSON_RES_NODE* next;
    char owner[64];
    char filepath[MAX_FILE_NAME_LENGTH];/* 文件路径 */
    uint64_t size; /* 文件大小 */
    char md5[64]; /* 文件MD5值 */
} P2P_JSON_RES_NODE;

#endif  /* SIGNWAY_P2P_TYPE_H */

